From c2a2f409564ec042c0c982b2de469d65c41a8037 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 9 Jul 2007 14:13:56 +0100 Subject: [PATCH] Allow inversion of boolean cmdline parameters with 'no-' prefix. Signed-off-by: Keir Fraser --- xen/common/kernel.c | 19 ++++++++++++++----- xen/include/xen/init.h | 6 +++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/xen/common/kernel.c b/xen/common/kernel.c index f8e4f11a0e..fea3224a76 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -26,10 +26,11 @@ int tainted; void cmdline_parse(char *cmdline) { - char opt[100], *optval, *q; + char opt[100], *optval, *optkey, *q; const char *p = cmdline; struct kernel_param *param; - + int invbool; + if ( p == NULL ) return; @@ -48,7 +49,7 @@ void cmdline_parse(char *cmdline) break; /* Grab the next whitespace-delimited option. */ - q = opt; + q = optkey = opt; while ( (*p != ' ') && (*p != '\0') ) { if ( (q-opt) < (sizeof(opt)-1) ) /* avoid overflow */ @@ -64,9 +65,14 @@ void cmdline_parse(char *cmdline) else optval = q; /* default option value is empty string */ + /* Boolean parameters can be inverted with 'no-' prefix. */ + invbool = !strncmp("no-", optkey, 3); + if ( invbool ) + optkey += 3; + for ( param = &__setup_start; param <= &__setup_end; param++ ) { - if ( strcmp(param->name, opt ) != 0 ) + if ( strcmp(param->name, optkey) ) continue; switch ( param->type ) @@ -79,7 +85,10 @@ void cmdline_parse(char *cmdline) simple_strtol(optval, (const char **)&optval, 0); break; case OPT_BOOL: - *(int *)param->var = 1; + *(int *)param->var = !invbool; + break; + case OPT_INVBOOL: + *(int *)param->var = invbool; break; case OPT_CUSTOM: ((void (*)(const char *))param->var)(optval); diff --git a/xen/include/xen/init.h b/xen/include/xen/init.h index 3ff3ff0e37..f5afd0cfa1 100644 --- a/xen/include/xen/init.h +++ b/xen/include/xen/init.h @@ -78,7 +78,7 @@ extern initcall_t __initcall_start, __initcall_end; */ struct kernel_param { const char *name; - enum { OPT_STR, OPT_UINT, OPT_BOOL, OPT_CUSTOM } type; + enum { OPT_STR, OPT_UINT, OPT_BOOL, OPT_INVBOOL, OPT_CUSTOM } type; void *var; unsigned int len; }; @@ -93,6 +93,10 @@ extern struct kernel_param __setup_start, __setup_end; static char __setup_str_##_var[] __initdata = _name; \ static struct kernel_param __setup_##_var __attribute_used__ \ __initsetup = { __setup_str_##_var, OPT_BOOL, &_var, sizeof(_var) } +#define invboolean_param(_name, _var) \ + static char __setup_str_##_var[] __initdata = _name; \ + static struct kernel_param __setup_##_var __attribute_used__ \ + __initsetup = { __setup_str_##_var, OPT_INVBOOL, &_var, sizeof(_var) } #define integer_param(_name, _var) \ static char __setup_str_##_var[] __initdata = _name; \ static struct kernel_param __setup_##_var __attribute_used__ \ -- 2.30.2